From 2f8df5237f57f788664d39965178677574d3876a Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 6 Nov 2016 14:41:07 +0100 Subject: [PATCH] flowbox: Turn into no-window widget --- gtk/gtkflowbox.c | 60 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/gtk/gtkflowbox.c b/gtk/gtkflowbox.c index f1bee97b96..26e39c005c 100644 --- a/gtk/gtkflowbox.c +++ b/gtk/gtkflowbox.c @@ -772,6 +772,7 @@ struct _GtkFlowBoxPrivate { GSequence *children; + GdkWindow *view_window; GtkCssGadget *gadget; GtkFlowBoxFilterFunc filter_func; gpointer filter_data; @@ -1562,15 +1563,15 @@ static void gtk_flow_box_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { + GtkFlowBox *box = GTK_FLOW_BOX (widget); + GtkFlowBoxPrivate *priv = BOX_PRIV (box); GtkAllocation clip; - GdkWindow *window; GtkAllocation child_allocation; gtk_widget_set_allocation (widget, allocation); - window = gtk_widget_get_window (widget); - if (window != NULL) - gdk_window_move_resize (window, + if (priv->view_window) + gdk_window_move_resize (priv->view_window, allocation->x, allocation->y, allocation->width, allocation->height); @@ -3112,13 +3113,13 @@ static void gtk_flow_box_realize (GtkWidget *widget) { GtkFlowBox *box = GTK_FLOW_BOX (widget); + GtkFlowBoxPrivate *priv = BOX_PRIV (box); GtkAllocation allocation; - GdkWindow *window; + GSequenceIter *iter; gtk_widget_get_allocation (GTK_WIDGET (box), &allocation); - gtk_widget_set_realized (GTK_WIDGET (box), TRUE); - window = gdk_window_new_child (gtk_widget_get_parent_window (GTK_WIDGET (box)), + priv->view_window = gdk_window_new_child (gtk_widget_get_parent_window (GTK_WIDGET (box)), gtk_widget_get_events (GTK_WIDGET (box)) | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK @@ -3127,18 +3128,53 @@ gtk_flow_box_realize (GtkWidget *widget) | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK, &allocation); - gtk_widget_register_window (GTK_WIDGET (box), window); - gtk_widget_set_window (GTK_WIDGET (box), window); + gtk_widget_register_window (GTK_WIDGET (box), priv->view_window); + + for (iter = g_sequence_get_begin_iter (priv->children); + !g_sequence_iter_is_end (iter); + iter = g_sequence_iter_next (iter)) + { + gtk_widget_set_parent_window (g_sequence_get (iter), priv->view_window); + } + + GTK_WIDGET_CLASS (gtk_flow_box_parent_class)->realize (widget); +} + +static void +gtk_flow_box_unrealize (GtkWidget *widget) +{ + GtkFlowBox *box = GTK_FLOW_BOX (widget); + GtkFlowBoxPrivate *priv = BOX_PRIV (box); + + gtk_widget_unregister_window (widget, priv->view_window); + gdk_window_destroy (priv->view_window); + priv->view_window = NULL; + + GTK_WIDGET_CLASS (gtk_flow_box_parent_class)->unrealize (widget); +} + +static void +gtk_flow_box_map (GtkWidget *widget) +{ + GtkFlowBox *box = GTK_FLOW_BOX (widget); + GtkFlowBoxPrivate *priv = BOX_PRIV (box); + + gdk_window_show (priv->view_window); + + GTK_WIDGET_CLASS (gtk_flow_box_parent_class)->map (widget); } static void gtk_flow_box_unmap (GtkWidget *widget) { GtkFlowBox *box = GTK_FLOW_BOX (widget); + GtkFlowBoxPrivate *priv = BOX_PRIV (box); remove_autoscroll (box); GTK_WIDGET_CLASS (gtk_flow_box_parent_class)->unmap (widget); + + gdk_window_hide (priv->view_window); } /* GtkContainer implementation {{{2 */ @@ -3697,6 +3733,8 @@ gtk_flow_box_class_init (GtkFlowBoxClass *class) widget_class->motion_notify_event = gtk_flow_box_motion_notify_event; widget_class->size_allocate = gtk_flow_box_size_allocate; widget_class->realize = gtk_flow_box_realize; + widget_class->unrealize = gtk_flow_box_unrealize; + widget_class->map = gtk_flow_box_map; widget_class->unmap = gtk_flow_box_unmap; widget_class->focus = gtk_flow_box_focus; widget_class->get_render_node = gtk_flow_box_get_render_node; @@ -4013,7 +4051,7 @@ gtk_flow_box_init (GtkFlowBox *box) GtkFlowBoxPrivate *priv = BOX_PRIV (box); GtkCssNode *widget_node; - gtk_widget_set_has_window (GTK_WIDGET (box), TRUE); + gtk_widget_set_has_window (GTK_WIDGET (box), FALSE); gtk_widget_set_redraw_on_allocate (GTK_WIDGET (box), TRUE); priv->orientation = GTK_ORIENTATION_HORIZONTAL; @@ -4202,6 +4240,8 @@ gtk_flow_box_insert (GtkFlowBox *box, gtk_flow_box_insert_css_node (box, GTK_WIDGET (child), iter); CHILD_PRIV (child)->iter = iter; + if (priv->view_window) + gtk_widget_set_parent_window (GTK_WIDGET (child), priv->view_window); gtk_widget_set_parent (GTK_WIDGET (child), GTK_WIDGET (box)); gtk_flow_box_apply_filter (box, child); } -- 2.30.2